#!/bin/bash

# Pure-FTPd 完整安装配置脚本 - CentOS 7
set -e

# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查系统
check_system() {
    if [[ $EUID -ne 0 ]] && ! sudo -n true 2>/dev/null; then
        log_error "需要 root 权限或 sudo 权限"
        exit 1
    fi
    
    if ! grep -q "CentOS" /etc/redhat-release 2>/dev/null; then
        log_warn "此脚本为 CentOS 7 优化，其他系统可能需要调整"
    fi
    
    log_info "系统检查通过"
}

# 安装 Pure-FTPd
install_pure_ftpd() {
    log_info "安装 Pure-FTPd..."
    
    # 确保 EPEL 仓库可用
    if ! rpm -qa | grep -q epel-release; then
        sudo yum install -y epel-release
        log_info "EPEL 仓库已安装"
    fi
    
    # 安装 Pure-FTPd
    if ! rpm -qa | grep -q pure-ftpd; then
        sudo yum install -y pure-ftpd
        log_info "Pure-FTPd 安装完成"
    else
        log_info "Pure-FTPd 已安装"
    fi
}

# 配置 Pure-FTPd
configure_pure_ftpd() {
    log_info "配置 Pure-FTPd..."
    
    # 创建必要目录
    sudo mkdir -p /etc/pure-ftpd/auth
    sudo mkdir -p /etc/pure-ftpd/conf
    sudo mkdir -p /var/ftp/upload
    sudo mkdir -p /etc/pure-ftpd/db
    
    # 基础安全配置
    echo "no" | sudo tee /etc/pure-ftpd/conf/NoAnonymous > /dev/null
    echo "yes" | sudo tee /etc/pure-ftpd/conf/CreateHomeDir > /dev/null
    echo "yes" | sudo tee /etc/pure-ftpd/conf/DontResolve > /dev/null
    echo "30000 30100" | sudo tee /etc/pure-ftpd/conf/PassivePortRange > /dev/null
    echo "10" | sudo tee /etc/pure-ftpd/conf/MaxClientsNumber > /dev/null
    echo "2" | sudo tee /etc/pure-ftpd/conf/MaxClientsPerIP > /dev/null
    
    # 启用 PureDB 认证
    echo "/etc/pure-ftpd/pureftpd.pdb" | sudo tee /etc/pure-ftpd/conf/PureDB > /dev/null
    
    # 创建认证符号链接
    if [[ ! -L /etc/pure-ftpd/auth/50puredb ]]; then
        sudo ln -sf /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/50puredb
        log_info "创建 PureDB 认证链接"
    fi
    
    # 设置目录权限
    sudo chown -R ftp:ftp /var/ftp/
    sudo chmod 755 /var/ftp/upload
    
    # 创建默认的 pureftpd.pdb 文件
    sudo touch /etc/pure-ftpd/pureftpd.passwd
    sudo chmod 600 /etc/pure-ftpd/pureftpd.passwd
    
    log_info "Pure-FTPd 基础配置完成"
}

# 配置防火墙
configure_firewall() {
    log_info "配置防火墙..."
    
    if systemctl is-active --quiet firewalld; then
        # 开放 FTP 端口
        sudo firewall-cmd --permanent --add-port=21/tcp
        sudo firewall-cmd --permanent --add-port=30000-30100/tcp
        sudo firewall-cmd --reload
        log_info "防火墙规则已添加"
    elif systemctl is-active --quiet iptables; then
        # iptables 配置
        sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
        sudo iptables -A INPUT -p tcp --dport 30000:30100 -j ACCEPT
        sudo service iptables save 2>/dev/null || log_warn "无法保存 iptables 规则"
        log_info "iptables 规则已添加"
    else
        log_warn "未检测到活动的防火墙，请手动配置"
        echo "  需要开放端口: 21 (FTP), 30000-30100 (被动模式)"
    fi
}

# 启动服务
start_services() {
    log_info "启动 Pure-FTPd 服务..."
    
    sudo systemctl enable pure-ftpd
    sudo systemctl start pure-ftpd
    
    # 检查服务状态
    if systemctl is-active --quiet pure-ftpd; then
        log_info "✓ Pure-FTPd 服务运行正常"
    else
        log_error "✗ Pure-FTPd 服务启动失败"
        sudo systemctl status pure-ftpd
        exit 1
    fi
}

# 创建测试用户
create_test_user() {
    log_info "创建测试 FTP 用户..."
    
    read -p "是否创建测试用户? (y/n): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        read -p "输入用户名: " username
        read -s -p "输入密码: " password
        echo
        
        # 创建用户
        echo "$password" | sudo pure-pw useradd "$username" -u ftp -g ftp -d "/var/ftp/upload/$username" -m
        sudo pure-pw mkdb
        
        # 创建用户目录
        sudo mkdir -p "/var/ftp/upload/$username"
        sudo chown ftp:ftp "/var/ftp/upload/$username"
        
        log_info "用户 $username 创建成功"
    fi
}

# 显示配置信息
show_info() {
    echo ""
    log_info "============================================"
    log_info "Pure-FTPd 安装配置完成！"
    echo ""
    echo "服务状态: $(systemctl is-active pure-ftpd)"
    echo "监听端口: $(ss -tlnp | grep :21 | awk '{print $4}' || echo '未监听 21 端口')"
    echo "配置目录: /etc/pure-ftpd/"
    echo "上传目录: /var/ftp/upload/"
    echo ""
    echo "常用管理命令："
    echo "  查看状态: sudo systemctl status pure-ftpd"
    echo "  重启服务: sudo systemctl restart pure-ftpd"
    echo "  查看日志: sudo journalctl -u pure-ftpd -f"
    echo ""
    echo "用户管理："
    echo "  创建用户: sudo pure-pw useradd 用户名 -u ftp -g ftp -d /var/ftp/upload/用户名 -m"
    echo "  删除用户: sudo pure-pw userdel 用户名 && sudo pure-pw mkdb"
    echo "  列出用户: sudo pure-pw list"
    echo "  更新密码: sudo pure-pw passwd 用户名 && sudo pure-pw mkdb"
    echo ""
    echo "配置文件位置："
    echo "  主配置: /etc/pure-ftpd/conf/"
    echo "  用户数据: /etc/pure-ftpd/pureftpd.pdb"
    log_info "============================================"
}

# 主执行流程
main() {
    log_info "Pure-FTPd 安装脚本开始执行..."
    
    check_system
    install_pure_ftpd
    configure_pure_ftpd
    configure_firewall
    start_services
    create_test_user
    show_info
    
    log_info "安装完成！"
}

# 执行主函数
main "$@"